package basedatos;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import modulos.usuario.modelo.Usuario;
import modulos.paciente.modelo.Paciente;
import modulos.reservacion.vista.iFrmReservaCita;

/**
 *
 * @author Edulima
 */
public class ReservacionBD extends OperacionesBD {

    public static List listarPorFecha(String fecha, String estado) {
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha = '" + fecha + "' AND estado = '" + estado + "' ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }

    public static List listarPorFecha(Usuario medico, String fecha, String estado) {
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha = '" + fecha + "' AND usuario_idPersona = " + medico.getIdPersona() + " AND estado = '" + estado + "' ORDER BY hora ASC"
                    + " ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }

    public static Object buscarPorFecha(Paciente paciente, String fecha, String estado) {
        Object obj = null;
        entidad.getTransaction().begin();
        try {
            obj = entidad.createQuery("Select a from Reservacion a where fecha = '" + fecha + "' AND paciente_idPersona = " + paciente.getIdPersona() + " AND estado = '" + estado + "' ").getSingleResult();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return obj;
    }

    public static boolean existe(Paciente paciente, Usuario usuario) {
        entidad.getTransaction().begin();
        try {
            entidad.createQuery("Select a from Reservacion a where paciente_idPersona = " + paciente.getIdPersona() + " AND " + " usuario_idPersona = " + usuario.getIdPersona() + " AND estado = '" + iFrmReservaCita.ESTADO_RESERVADO + "' ").getSingleResult();
            entidad.getTransaction().commit();
            return true;
        } catch (Exception e) {
            entidad.getTransaction().rollback();
            return false;
        }

    }

    public static boolean existe(Paciente paciente, int hora) {
        entidad.getTransaction().begin();
        try {
            entidad.createQuery("Select a from Reservacion a where paciente_idPersona = " + paciente.getIdPersona() + " AND " + " hora = " + hora + " AND estado = '" + iFrmReservaCita.ESTADO_RESERVADO + "' ").getSingleResult();
            entidad.getTransaction().commit();
            return true;
        } catch (Exception e) {
            entidad.getTransaction().rollback();
            return false;
        }

    }

    /**
     * Lista las reservaciones que estan en el intervalo de tiempo desde - hasta
     *
     * @author Edulima
     * 
     * @param desde fecha desde cuando se desea la consulta
     * @param hasta fecha hasta cuando se desea la consulta
     * @return devuelve un listado de las Reservaciones encontradas
     * 
     */
    public static List listarPorFecha(Date desde, Date hasta) {
        DateFormat fd = new SimpleDateFormat("yyyy-MM-dd");
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha >= '" + fd.format(desde) + "' AND fecha <= '" + fd.format(hasta) + "' ORDER BY fecha ASC ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }
    
    /**
     *Lista las reservaciones que estan en el intervalo de tiempo desde - hasta
     *delimitando la busqueda para un determinado paciente y un determinado usuario
     * @author Edulima
     * 
     * @param desde fecha desde cuando se desea la consulta
     * @param hasta fecha hasta cuando se desea la consulta
     * @param paciente paciente del cual se realizara la busqueda
     * @param usuario es el medico del cual se realizara la busqueda
     * @return devuelve un listado de las Reservaciones encontradas
     * 
     */
    public static List listarPorFecha(Usuario usuario,Paciente paciente,Date desde, Date hasta) {
        DateFormat fd = new SimpleDateFormat("yyyy-MM-dd");
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha >= '" + fd.format(desde) + "' AND fecha <= '" + fd.format(hasta) + "' AND usuario_idPersona = "+usuario.getIdPersona()+" AND paciente_idPersona = "+paciente.getIdPersona()+" ORDER BY fecha ASC ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }
    
    /**
     *Lista las reservaciones que estan en el intervalo de tiempo desde - hasta
     *delimitando la busqueda para un determinado paciente y un determinado usuario
     * @author Edulima
     * 
     * @param desde fecha desde cuando se desea la consulta
     * @param hasta fecha hasta cuando se desea la consulta
     * @param paciente paciente del cual se realizara la busqueda
      * @return devuelve un listado de las Reservaciones encontradas
     * 
     */
    public static List listarPorFecha(Paciente paciente,Date desde, Date hasta) {
        DateFormat fd = new SimpleDateFormat("yyyy-MM-dd");
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha >= '" + fd.format(desde) + "' AND fecha <= '" + fd.format(hasta) + "' AND paciente_idPersona = "+paciente.getIdPersona()+" ORDER BY fecha ASC ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }
    
    /**
     *Lista las reservaciones que estan en el intervalo de tiempo desde - hasta
     *delimitando la busqueda para un determinado paciente y un determinado usuario
     * @author Edulima
     * 
     * @param desde fecha desde cuando se desea la consulta
     * @param hasta fecha hasta cuando se desea la consulta
       * @param usuario es el medico del cual se realizara la busqueda
     * @return devuelve un listado de las Reservaciones encontradas
     * 
     */
    public static List listarPorFecha(Usuario usuario,Date desde, Date hasta) {
        DateFormat fd = new SimpleDateFormat("yyyy-MM-dd");
        entidad.getTransaction().begin();
        try {
            lista = entidad.createQuery("Select a from Reservacion a where fecha >= '" + fd.format(desde) + "' AND fecha <= '" + fd.format(hasta) + "' AND usuario_idPersona = "+usuario.getIdPersona()+" ORDER BY fecha ASC ").getResultList();
            entidad.getTransaction().commit();
        } catch (Exception e) {
            entidad.getTransaction().rollback();
        }
        return lista;
    }
}
